package config

import (
	"bufio"
	"fmt"
	"os"
	"path/filepath"
	"strings"
)

// ServiceConfig 保存服务组件的配置信息
type ServiceConfig struct {
	AppID     string
	AppSecret string
	Name      string
	Port      string
	Version   string
}

// LoadFromEnv 从环境变量加载配置
// 如果环境变量不存在，则尝试从.env文件加载
func LoadFromEnv() ServiceConfig {
	config := ServiceConfig{
		// 提供默认值
		Port:    "8888",
		Version: "1.0.0",
	}

	// 尝试从环境变量获取
	if appID, exists := os.LookupEnv("APP_ID"); exists {
		config.AppID = appID
	}
	if appSecret, exists := os.LookupEnv("APP_SECRET"); exists {
		config.AppSecret = appSecret
	}
	if name, exists := os.LookupEnv("APP_NAME"); exists {
		config.Name = name
	}
	if port, exists := os.LookupEnv("APP_PORT"); exists {
		config.Port = port
	}
	if version, exists := os.LookupEnv("APP_VERSION"); exists {
		config.Version = version
	}

	// 如果没有从环境变量获取到AppID或AppSecret，尝试从.env文件加载
	if config.AppID == "" || config.AppSecret == "" {
		loadFromDotEnvFile(&config)
	}

	// 如果仍然缺少必要信息，尝试通过目录名确定组件名称
	if config.Name == "" {
		// 获取当前工作目录的名称作为服务组件名称
		if dir, err := os.Getwd(); err == nil {
			config.Name = filepath.Base(dir)
		}
	}

	return config
}

// loadFromDotEnvFile 从当前目录的.env文件加载配置
func loadFromDotEnvFile(config *ServiceConfig) {
	// 尝试打开.env文件
	file, err := os.Open(".env")
	if err != nil {
		return // 文件不存在或无法打开，直接返回
	}
	defer file.Close()

	// 逐行读取文件内容
	scanner := bufio.NewScanner(file)
	for scanner.Scan() {
		line := scanner.Text()

		// 跳过注释和空行
		if strings.HasPrefix(line, "#") || strings.TrimSpace(line) == "" {
			continue
		}

		// 解析"KEY=VALUE"格式
		parts := strings.SplitN(line, "=", 2)
		if len(parts) != 2 {
			continue
		}

		key := strings.TrimSpace(parts[0])
		value := strings.TrimSpace(parts[1])

		// 去除值两端的引号（如果有）
		if len(value) >= 2 && (value[0] == '"' && value[len(value)-1] == '"') ||
			(value[0] == '\'' && value[len(value)-1] == '\'') {
			value = value[1 : len(value)-1]
		}

		// 根据键名更新配置
		switch key {
		case "APP_ID":
			config.AppID = value
		case "APP_SECRET":
			config.AppSecret = value
		case "APP_NAME":
			config.Name = value
		case "APP_PORT":
			config.Port = value
		case "APP_VERSION":
			config.Version = value
		}
	}
}

// Validate 验证配置是否有效
func (c *ServiceConfig) Validate() error {
	if c.AppID == "" {
		return fmt.Errorf("缺少必填配置: APP_ID")
	}
	if c.AppSecret == "" {
		return fmt.Errorf("缺少必填配置: APP_SECRET")
	}
	return nil
}
